Prolog Syntax & Structures (Lecture 4)
- في المحاضرة دي هنفهم أكتر عن الـ Syntax (طريقة كتابة الكود) في الـ Prolog.
- هنتعمق في أنواع البيانات (Data Objects) والـ Structures (البيانات المركبة) وإزاي بنمثلها.
- هنعرف إزاي الـ Prolog بيعمل Matching (مطابقة أو Unification) بين البيانات المختلفة.
- وهنراجع على أدوات الربط المنطقية (Conjunction & Disjunction) وأولوياتها.
1. أنواع البيانات (Data Objects / Terms)
كل البيانات في Prolog بنسميها Terms. بتنقسم لنوعين أساسيين زي ما بدأنا نفهم قبل كده:
أولاً: Simple Objects
بتشمل الـ Constants (الثوابت) والـ Variables (المتغيرات).
1. الـ Atoms
- دي ثوابت نصية ممكن تتكتب بـ 3 طرق:
- حروف وأرقام و Underscore: لازم تبدأ بحرف صغير (Lower-case).
- أمثلة صحيحة:
anna,x25,x_y.
- أمثلة صحيحة:
- رموز خاصة (Special Characters):
- أمثلة صحيحة:
<---->, ==>,::.
- أمثلة صحيحة:
- أي نصوص بين Single Quotes (
' '): دي بتسمحلك تحط مسافات أو تبدأ بحرف كابيتال.- أمثلة صحيحة:
' Tom ','South America','Sarah Jones'.
- أمثلة صحيحة:
- حروف وأرقام و Underscore: لازم تبدأ بحرف صغير (Lower-case).
- ا
2340ieh(بتبدأ برقم). - ا
george-smith(فيها Dash-). - ا
Void(بتبدأ بحرف Capital -> دي كده Variable). - ا
_alpha(بتبدأ بـ Underscore -> دي كده Variable).
2. الـ Numbers
- أرقام صحيحة (Integers): زي
1,1313,-97. - أرقام عشرية (Real Numbers): زي
3.14,-0.0035.
3. الـ Variables
- لازم تبدأ بحرف كبير (Upper-case) أو Underscore (
_).- أمثلة:
X,Result,_x23.
- أمثلة:
- الـ Anonymous Variable (المتغير المجهول
_): بنستخدمه لو محتاجين نسأل عن حاجة بس مش مهتمين بقيمتها (مش عايزين نطبعها).- مثال:
?- parent(X, _).(مين اللي عنده أي أبناء وخلاص؟ مش مهم أسامي الأبناء).
- مثال:
ثانياً: Structured Objects
الـ Structure هو كائن واحد بيتكون من مجموعة كائنات تانية جواه (Components).
- شكلها:
functor(component1, component2, ...) - الـ Functor: هو اسم الـ Structure (ولازم يكون Atom يعني بيبدأ بحرف صغير).
- الـ Components: هي العناصر اللي جوه، وممكن تكون ثوابت، متغيرات، أو حتى Structures تانية (Nested).
نقدر نستخدم متغيرات جوة الـ Structure عادي، زي: date(Day, may, 2001).
تمثيل الـ Structures كشجرة (Tree Representation)
أي Structure نقدر نتخيله على شكل شجرة. الـ Functor هو الـ Root (الجذر)، والـ Components هم الفروع.
graph TD
Date(("date
(Functor)"))
C1["1"]
C2["may"]
C3["2001"]
Date --- C1
Date --- C2
Date --- C3تمثيل المعادلات الحسابية
المعادلات الحسابية في الـ Prolog بتتعامل كـ Structures، حيث العمليات (زي + و *) هي الـ Functors.
مثال للمعادلة: (a + b) * (c - 5)
تتكتب كـ Structure كده: *( +(a, b), -(c, 5) ) حاجة شبه الـ prefix , postfix الي اخدناها في الداتا ستراكتشر قبل كده
graph TD
Mult((" Multiply (*) "))
Add((" Add (+) "))
Sub((" Subtract (-) "))
A["a"]
B["b"]
C["c"]
Five["5"]
Mult --- Add
Mult --- Sub
Add --- A
Add --- B
Sub --- C
Sub --- Five2. الـ Matching (المطابقة / Unification)
من أهم العمليات في الـ Prolog هي الـ Matching. بنقول إن قيمتين (Terms) بيطابقوا بعض لو كانوا:
- متطابقين تماماً (Identical).
- أو نقدر نعوض في المتغيرات اللي فيهم عشان يبقوا متطابقين.
قواعد المطابقة الأساسية:
- لو Constants : بيطابقوا بعض لو هما نفس الحاجة بالظبط (مثلاً
may = may). - لو Variable مع أي حاجة: بيطابقها فوراً والمتغير بياخد القيمة دي .
- لو Structures (أشياء مركبة): بيطابقوا بعض فقط لو:
- ليهم نفس الـ Functor (نفس الاسم).
- ليهم نفس الـ Arity (نفس عدد الـ Components/Arguments).
- وكل Component بيطابق الـ Component اللي في نفس مكانه الناحية التانية.
أمثلة على الـ Matching:
- مثال 1:
?- date(4, M, 2001) = date(D1, may, Y1).
-
النتيجة:
D = 4,M = may,Y1 = 2001(المطابقة نجحت). -
مثال 2 (Nested Structures):
?- addr(flat(4), street('Home Str.'), postcode(eh8_9lw)) = addr(flat(Z), Yy, postcode(Xxx)).
- النتيجة:
Z = 4,Yy = street('Home Str.'),Xxx = eh8_9lw(المطابقة بتشتغل بشكل تكراري Recursively على العناصر الداخلية).
3. أدوات الربط والأولويات (Conjunction & Disjunction)
| الأداة | الرمز | المعنى | الأولوية (Binding Strength) |
|---|---|---|---|
| Conjunction | , |
AND (و) - لازم كل الشروط تكون صح. | أقوى (Stronger) |
| Disjunction | ; |
OR (أو) - كفاية شرط واحد يكون صح. | أضعف (Weaker) |
مثال على الأولويات:
- لو كتبنا:
P :- Q, R; S, T, U.
- عشان الـ
,(AND) أقوى، الـ Prolog بيفهمها كأنها متقسمة بقوسين كده:
P :- (Q, R) ; (S, T, U).
- يعني كأننا كتبنا قاعدتين منفصلين:
P :- Q, R.
P :- S, T, U.